#ifndef _BROWSER_AREA__H_
#define _BROWSER_AREA__H_

#include <QGraphicsView>
#include <QWidget>
#include <QUrl>
#include <QString>
#include <QList>
#include <QGraphicsProxyWidget>
#include <QFile>
#include <QDebug>
#include <QKeyEvent>
#include <QGraphicsItemAnimation>
#include <QTimeLine>
#include <QByteArray>
#include <QMouseEvent>
#include <QWheelEvent>

#include <math.h>

#include "webview.h"

/**
 * browserarea.h browserarea.cpp (PC)
 *
 * Area do browser multi-abas,
 * deverá tratar criação e destruição de abas,
 * navegação em si(com objetos QWebView)
 * A maneira de manipulação de abas é livre para quem
 * implementar essa classe(abas padrão(firefox), zoom, iphone, etc.),
 * entretanto respeitando os slots "newTab" e "closeTab".
 * obs.: somente uma aba por vez deve estar "focada".
 * obs. 2: no mínimo uma aba deve estar aberta
 *
 * LINK PARA CORRIGIR O BUG DO QT(QWebView dentro de QGraphicsView):
 * http://trolltech.com/developer/task-tracker/index_html?method=entry&id=212270
 *
 */
class BrowserArea : public QGraphicsView
{
    Q_OBJECT

private:
    /* cena */
    QGraphicsScene cena;

    /* lista de páginas abertas */
    QList <WebView*> paginas;
    QList <QGraphicsProxyWidget*> proxyItens;
    
    /* pagina atual horas */
    WebView* paginaAtual;
    QGraphicsProxyWidget* proxyItemAtual;
    QGraphicsProxyWidget* proxyItemAnterior;
    
    /* ítem que agrupa todos os ProxyItens */
    QGraphicsItem *itemPrincipal;
    
    /* método para pegar a página inicial do arquivo de configuração */
    QString getPaginaInicial();
    
    void reposicionaPaginas();
    
    int ncol, nrow;
    
    QByteArray conteudoAbaVazia();
    
    QSize tamanho;
    
    QPoint getPosItem( QGraphicsItem* item );
    QPoint posicaoExibirTodasAbas();

    void mudouPagina();
    
    void conectaSinaisPaginaAtual();
    
    bool modoEscolhaAba;
    
    void abaEscolhida(qreal x, qreal y);

private slots:
    void statusMessagePaginaAtual ( const QString & text );
    void titleChangedPaginaAtual ( const QString & title );
    void urlChangedPaginaAtual ( const QUrl & url );
    void loadFinished (bool ok);

protected:
    void keyPressEvent(QKeyEvent* event);
	void mousePressEvent(QMouseEvent* event);
    void wheelEvent(QWheelEvent* event);

public:
    /** Cria graphicsview e QGraphicsScene internamente associando,
     * abre uma aba contendo a página inicial lida do arquivo
     * de configuração(ver formato do arquivo de configuração)
     */
    BrowserArea(QWidget *parent=0);
    
    /* ajusta o tamanho das paginas quando maximiza a tela */
    void novoTamanho();

public slots:

    /** Cria uma nova aba contendo a url(ou nenhuma se for o caso)
     *  e foca nessa nova aba */
    void newTab(const QUrl & url = QUrl());
    
    /** Fecha aba corrente se houver duas ou mais abas abertas */
    void closeTab();

    /** Carrega url na aba corrente(ver QWebView) */
    void load(const QUrl & url);
    
    /** Recarrega aba corrente(ver QWebView) */
    void reload();
    
    /** Interrompe carregamento da aba corrente(ver QWebView) */
    void stop();
    
    /** Vai para proximo item no historico, se houver(ver QWebView) */
    void forward();
    
    /** Volta um item no historico, se houver(ver QWebView) */
    void back();
    
    /* ativa o modo de escolher a aba atual */
    void chooseActivePage();

signals:

    /** Signal emitido quando a aba corrente muda mensagem de status(ver QWebView)
      * ou muda-se para outra aba */
    void statusBarMessage ( const QString & text );
    
    /** Sinal emitido quando a aba corrente muda o título da página(ver QWebView)
     *  ou muda-se para outra aba */
    void titleChanged ( const QString & title );
    
    /** Sinal emitido quando a aba corrente muda o url(ver QWebView)
      * ou muda-se para outra aba */
    void urlChanged ( const QUrl & url );
    
    /** Sinal emitido quando um link é visitado. para logar no histórico */
    void urlVisited (const QUrl & url);
};

#endif /* _BROWSER_AREA__H_ */
